home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
et
/
et3_0-a1.lha
/
et3
/
src
/
Object.h
< prev
next >
Wrap
C/C++ Source or Header
|
1992-07-23
|
7KB
|
219 lines
#ifndef Object_First
#ifdef __GNUG__
//pragma once
#pragma interface
#endif
#define Object_First
#include "Types.h"
#include "Storage.h"
#include "Stream.h"
class Object;
class AccessMembers;
const int cIdNone = -1,
cPartAnyChange = 27;
typedef bool (*BoolFun)(Object*, Object*, void*);
typedef Object* (*ObjPtrFun)(Object*, Object*, void*);
typedef void (Object::*ObjMemberFunc)(...);
typedef void (Object::*VoidObjMemberFunc)(...);
typedef unsigned char (Object::*BoolObjMemberFunc)(...);
extern int gDebug;
//---- client flags -----------------------------------------------------
enum ObjFlags {
eObjIsDeleted = BIT(0),
cObjIsShared = BIT(1),
eObjDefault = 0,
eObjLast = 1
};
//---- private flags, clients can only test but not set them ------------
const int cObjNonDeleted = 0x01000000,
cObjDelayChanges = 0x02000000,
cObjVisited = 0x04000000,
cObjIsProto = 0x08000000,
cObjIsObserved = 0x10000000;
const int cFlagMask= 0x00ffffff;
//---- class Object -----------------------------------------------------
class Object {
friend class Class;
public:
//---- automatically added by macro metaDef --------------------------------
static class Class *isa;
friend IStream &operator>> (IStream &s, Object *&op)
{ return ::LoadPtr(s, op, Object::isa); }
friend class Class *_Type(Object*)
{ return Object::isa; }
Object(class _dummy*);
virtual class Class *IsA();
virtual void Members(AccessMembers*);
//--------------------------------------------------------------------------
public:
Object(int f= eObjDefault);
virtual ~Object();
virtual void FreeAll();
//---- memory allocation
void *operator new (size_t sz)
{ return Storage::ObjectAlloc(sz); }
void *operator new (size_t sz, char *file, int line)
{ return Storage::ObjectAlloc(sz, file, line); }
void operator delete(void *vp)
{ Storage::ObjectFree(vp); }
# define IsKindOf(name) IsA()->isKindOf(Meta(name))
//----- flag manipulation --------------------------------------------------
void SetFlag(int f, bool b);
void SetFlag(int f)
{ flags|= f & cFlagMask; }
void ResetFlag(int f)
{ flags&= ~(f & cFlagMask); }
bool TestFlag(int f)
{ return (bool) ((flags & f) != 0); }
void InvertFlag(int f)
{ flags^= f & cFlagMask; }
//---- attributes ----------------------------------------------------------
char *ClassName();
void MarkAsDeleted()
{ SetFlag(eObjIsDeleted); }
bool IsDeleted()
{ return TestFlag(eObjIsDeleted); }
void SetVisited()
{ flags|= cObjVisited; }
void ClearVisited()
{ flags&= ~cObjVisited; }
bool IsObserved()
{ return TestFlag(cObjIsObserved); }
bool IsShared()
{ return TestFlag(cObjIsShared); }
void SetShared()
{ SetFlag(cObjIsShared); }
//---- comparing -----------------------------------------------------------
virtual u_long Hash();
virtual bool IsEqual (Object*);
virtual int Compare (Object*);
//---- converting, activation passivation ----------------------------------
virtual char* AsString();
virtual OStream& PrintOn(OStream&);
virtual IStream& ReadFrom(IStream&);
virtual Object *ReadAndMap(IStream&);
friend OStream &operator<< (OStream &os, Object &op)
{ return op.PrintOn(os); }
friend IStream &operator>> (IStream &is, Object &op)
{ return op.ReadFrom(is); }
friend IStream &LoadPtr(IStream &is, Object *&op, Class *staticclass);
friend OStream& operator<< (OStream &os, Object *op);
//---- cloning -------------------------------------------------------------
Object* New();
virtual void InitNew();
virtual Object *Clone();
virtual Object *deepclone();
Object *DeepClone();
//---- change propagation --------------------------------------------------
void AddObserver(Object*);
Object* RemoveObserver(Object*);
virtual void Send(int id= cIdNone, int part= cPartAnyChange, void *vp= 0);
virtual void DoObserve(int id, int part, void *vp, Object *op);
void Changed()
{ Send(); }
class Iterator *GetObserverIter();
void DelayChanges();
void FlushChanges();
virtual bool PrintOnWhenObserving(Object *);
//---- error handling ------------------------------------------------------
virtual void DoError(int level, char *location, char *fmt, va_list va);
void Error(char *method, char *msgfmt, ...);
void SysError(char *method, char *msgfmt, ...);
void Warning(char *method, char *msgfmt, ...);
void Fatal(char *method, char *msgfmt, ...);
//---- fire walls ----------------------------------------------------------
void AbstractMethod(char*);
void MayNotUse(char*);
Object *guard(Class*);
# define Guard(p,name) ((name*)(p)->guard(Meta(name)))
//---- inspecting, debugging -----------------------------------------------
void Inspect(bool block= FALSE);
void EditSource(bool declaration);
virtual void InspectorId(char *buf, int bufSize);
virtual void CollectParts(class Collection*);
void ScanMembers(u_long, ...);
// direct (unchecked) access to instance variables; returns address of variable
void* GetAddrOf(const char *varname, Class *&cl);
protected:
static int _an;
static class AccessMembers *_accessMembers;
protected:
//---- overridden if observers are stored in the object itself
virtual class Collection *MakeObserverColl();
virtual class Collection *GetObservers();
virtual void DestroyObserverColl();
virtual void SetObserverColl(Collection *);
void CleanupObservers(Collection *);
private:
u_int flags;
Object(const Object&);
};
//---- DoDelayChanges ----------------------------------------------------------
// to delay the calls to Changed and ChangedWhat an instance of the class
// DelayChanges can be declared
// eg: Text::Cut() { DelayChanges dc(this); ... }
class DoDelayChanges {
Object *op;
public:
DoDelayChanges(Object *o)
{ op= o; op->DelayChanges(); }
~DoDelayChanges()
{ op->FlushChanges(); }
};
//---- MetaDef macros ----------------------------------------------------------
#define Meta(name) name::isa
#define SMeta(name) _NAME2_(__isa__,name)
#define MetaDef(name) \
name(class _dummy*); \
static class Class *isa; \
Class *IsA(); \
friend char *_NAME2_(name,DeclFileName)(char *p= __FILE__) \
{ return p; } \
friend int _NAME2_(name,DeclFileLine)(int i= __LINE__) \
{ return i; } \
friend IStream &operator>> (IStream &s, name *&op) \
{ return LoadPtr(s, (Object*&)op, Meta(name)); } \
void Members(AccessMembers *ac); \
friend class Class *_Type(name*) \
{ return Meta(name); }
#endif